# coding:utf-8
r''' 传鸿组态请求处理器
 * @ 作  者: 阿拉丁矿工 黄传鸿 <hchhyzc@foxmail.com>
'''
# ====================================================================|引入包
import tornado.web
import tornado.gen
from .Hmysql import HmysqlClass
from .Hdrive import HdriveClass
import os
import sys
import json
import time
import datetime
import pandas as pd
import threading
from pylogix import PLC

# 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
#  设备扫描
# 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

# 实例化类-数据库
mydb = HmysqlClass()
'''实例化类-数据库 '''

# 实例化类-驱动
myDrive = HdriveClass()
'''实例化类-驱动 '''

# ——————————————————————————————————————————————————————————————————————
# 设备扫描
# ——————————————————————————————————————————————————————————————————————


def euipmentScan():
    '''设备扫描'''
    # print("设备扫描")
    while True:
        if myDrive.driveScanState:
            # print("扫描开始")
            for info in myDrive.channelDetail:
                # print(info)
                equipDataId = str(info['equipDataId'])
                res = getPLCValbyLabel(info)  # 获取PLC变量值
                # 遍历设备;更新设备数据
                # print("遍历设备;更新设备数据")
                for e in myDrive.equipData:
                    if str(e['equipDataId']) == equipDataId:
                        e['equipDataVal'] = res  # 更改设备值
            # time.sleep(0.001)
            # print("扫描结束")
            mydb.addToEquip(myDrive.equipData)
        else:
            # print("！设备扫描已关闭")
            break

# ——————————————————————————————————————————————————————————————————————
# 获取PLC变量值
# ——————————————————————————————————————————————————————————————————————


def getPLCValbyLabel(info):
    '''获取PLC变量值'''
    # print("\n♈ 获取罗克韦尔PLC变量值")
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #   ★ 变量转储
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # 通道类型
    ChType = str(info['ChType'])
    '''通道类型'''
    # ip地址
    IpAddr = str(info['IpAddr'])
    '''ip地址'''
    # cpu插槽
    CPUSlot = int(info['CPUSlot'])
    '''cpu插槽'''
    # 设备标签
    equipDataLabel = str(info['equipDataLabel'])
    '''设备标签'''
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #   ★ 读取AB_PLC_Control AB_PLC_Compact
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # print("\n♈ 读取AB_PLC_Control AB_PLC_Compact")
    if (ChType == 'AB_PLC_Control') or (ChType == 'AB_PLC_Compact'):
        with PLC() as comm:
            comm.IPAddress = IpAddr
            comm.ProcessorSlot = CPUSlot
            ret = comm.Read(equipDataLabel)
            # print("\n结果:--------------------------------------------------------------")
            # print(ret.TagName, ret.Value, ret.Status)
            # print("\n    --------------------------------------------------------------")
            return ret.Value
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #   ★ 读取AB_PLC_Micro
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # print("\n♈ 读取AB_PLC_Control AB_PLC_Compact")
    if ChType == 'AB_PLC_Micro':
        with PLC() as comm:
            comm.Micro800 = True
            comm.IPAddress = IpAddr
            comm.ProcessorSlot = CPUSlot
            ret = comm.Read(equipDataLabel)
            # print(ret.TagName, ret.Value, ret.Status)
            return str(ret.Value)


# 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
# 请求处理器
# 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓


class HrequestClass(tornado.web.RequestHandler):
    '''请求处理器'''

# ——————————————————————————————————————————————————————————————————————
# get查询
# ——————————————————————————————————————————————————————————————————————
    # @tornado.gen.coroutine
    def get(self):
        '''get查询'''
        # # print("\n♈ get-查询")
        query = self.get_argument("query", strip=True)  # 状态
        # print(myDrive.serverState)

        # =========================================================
        # 获取块
        # =========================================================
        if query == "getBlockGroup":
            # # print("\n♋ get查询-获取块")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                FileDir = "statics/blockGroup.json"
                with open(FileDir, "r",  encoding='utf-8') as f:
                    self.set_status(200)
                    self.write(f.read())
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取笔筒
        # =========================================================
        if query == "getPenContainer":
            # # print("\n♋ get查询-获取笔筒")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                FileDir = "statics/penContainer.json"
                with open(FileDir, "r",  encoding='utf-8') as f:
                    self.set_status(200)
                    self.write(f.read())

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取工程列表
        # =========================================================
        if query == "getProjectList":
            # print("\n♋ get查询-获取工程列表")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 获取文件名列表
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # # print(" 获取文件名列表")
                file_dir = "statics/projects/"
                FileNemeList = []  # 文件名列表
                for root, dirs, files in os.walk(file_dir):
                    for file in files:
                        if os.path.splitext(file)[1] == '.json':
                            FileNemeList.append(file)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 遍历获取文件名列表
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # # print("\n♋ get查询-遍历获取文件名列表")
                ProjectList = []
                for item in FileNemeList:
                    FileDir = os.path.join(
                        'statics/projects/', item)
                    with open(FileDir, 'r', encoding='utf-8') as f:
                        ResDict = json.load(f)  # 此时ResDict是一个字典对象
                        ProjectListItem = {
                            'label': ResDict['label'],
                            'key': ResDict['key'],
                            'calendar': ResDict['calendar'],
                        }
                        ProjectList.append(ProjectListItem)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出工程列表
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # print(ProjectList)
                self.set_status(200)
                self.write(json.dumps(ProjectList))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取工程 根据文件名称
        # =========================================================
        if query == "getProject":
            # # print("\n♋ get查询-获取工程")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                name = self.get_argument("Name", strip=True)  # 文件名
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 读取工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                data = ''
                FileDir = "statics/projects/" + name + ".json"
                with open(FileDir, "r",  encoding='utf-8') as f:
                    data = f.read()

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(data)


            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 删除工程
        # =========================================================
        if query == "deleteProject":
            # # print("\n♋ get查询-删除工程")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                name = self.get_argument("Name", strip=True)  # 文件名
                DeleteFile = "statics/projects/" + name + '.json'
                os.remove(DeleteFile)
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('OK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取 客户端数据集
        # =========================================================
        if query == "getClientSet":
            # # print("\n♋ get查询-获取 客户端数据集")
            name = self.get_argument("Name", strip=True)  # 文件名

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 读取当前工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                data = ''
                FileDir = "statics/projects/" + name + '.json'
                with open(FileDir, "r",  encoding='utf-8') as f:
                    data = f.read()

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 转换为字典;筛选出数据
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                projectDict = json.loads(data)
                data = projectDict['clientSet']

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 客户端数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(json.dumps(data))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取 控制数据集
        # =========================================================
        if query == "getCtrlSet":
            # # print("\n♋ get查询-获取 控制数据集")
            name = self.get_argument("Name", strip=True)  # 文件名

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 读取当前工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                data = ''
                FileDir = "statics/projects/" + name + '.json'
                with open(FileDir, "r",  encoding='utf-8') as f:
                    data = f.read()

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 转换为字典;筛选出数据
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                projectDict = json.loads(data)
                data = projectDict['ctrlSet']

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 控制数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(json.dumps(data))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取 设备数据集
        # =========================================================
        if query == "getEquipSet":
            # # print("\n♋ get查询-获取 设备数据集")
            name = self.get_argument("Name", strip=True)  # 文件名

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 读取当前工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                data = ''
                FileDir = "statics/projects/" + name + '.json'
                with open(FileDir, "r",  encoding='utf-8') as f:
                    data = f.read()

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 转换为字典;筛选出数据
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                projectDict = json.loads(data)
                data = projectDict['equipData']

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 设备数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(json.dumps(data))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取 工作视图
        # =========================================================
        if query == "getWorkView":
            # print("\n♋ get查询-获取工作视图")
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                name = self.get_argument("Name", strip=True)  # 文件名
                PageId = self.get_argument("pageId", strip=True)  # 文件名
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 读取当前工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                data = ''
                FileDir ="statics/projects/" + name + '.json'
                with open(FileDir, "r",  encoding='utf-8') as f:
                    data = f.read()

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 转换为字典;筛选出数据
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                projectDict = json.loads(data)
                # # print(projectDict)

                viewData = projectDict['pages']
                pageData = []
                for Item in viewData:
                    if Item['key'] == PageId:
                        # print(Item)
                        pageData.append(Item)

                # # print("------------------------------------------------ pageData")
                # # print(pageData)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 建立工作数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                workSet = {
                    'pageData': pageData[0],
                    'equipData': projectDict['equipData'],
                }
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(json.dumps(workSet))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 开启数据服务
        # =========================================================
        if query == "startServer":
            # print("\n♋ get查询-开启数据服务")
            myDrive.ServerState = True
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 输出 响应结果
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            self.set_status(200)
            self.write('OK')

        # =========================================================
        # 停止数据服务
        # =========================================================
        if query == "stopServer":
            # print("\n♋ get查询-停止数据服务")
            myDrive.ServerState = False
            myDrive.StopDraveScan = False
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 输出 响应结果
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            self.set_status(200)
            self.write('OK')

        # =========================================================
        # 获取服务状态
        # =========================================================
        if query == "getServerState":
            # print("\n♋ get查询-获取服务状态")
            self.set_status(200)
            self.write(json.dumps(myDrive.ServerState))

        # =========================================================
        # 初始化数据库
        # =========================================================
        if query == "initDatabase":
            # print("\n♋ get查询-初始化数据库")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 更改 数据库
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                mydb.dropDB()  # 删除数据库
                mydb.createDB()  # 创建数据库
                mydb.createChannelTable()    # 创建-通道表
                mydb.createChannelTable()       # 创建表-通道表
                mydb.createEquipTable()     # 创建表-设备表
                mydb.createHistoryTable()       # 创建表-历史记录表
                mydb.createChannelDetailsView()  # 创建视图-通道详情

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 创建;添加库; 通道
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                myDrive.createChannel()  # 创建通道
                # print("通道 channels=", myDrive.Channels)
                mydb.addToChannel(myDrive.Channels)  # 添加到通道表

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 创建;添加库; 设备
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                myDrive.createEquip()  # 创建设备
                # print("设备 equipData=", myDrive.EquipData)
                mydb.addToEquip(myDrive.EquipData)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 创建 通道详情
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                myDrive.createChannelDetail()  # 创建通道详情

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('OK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 开启驱动扫描
        # =========================================================
        if query == "startDraveScan":
            # print("\n♋ get查询-开启数据服务")
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                myDrive.ServerState = True
                task = threading.Thread(target=euipmentScan)
                task.start()
                self.set_status(200)
                self.write("OK")
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 停止驱动扫描
        # =========================================================
        if query == "stopDraveScan":
            # print("\n♋ get查询-停止驱动扫描")
            myDrive.StopDraveScan = False
            self.set_status(200)
            self.write("OK")

        # =========================================================
        # 获取导航列表
        # =========================================================
        if query == "getNavigationList":
            # print("\n♋ get查询-获取导航列表")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 获取文件名列表
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # # print(" 获取文件名列表")
                file_dir = "statics/projects/"
                FileNemeList = []  # 文件名列表
                for root, dirs, files in os.walk(file_dir):
                    for file in files:
                        if os.path.splitext(file)[1] == '.json':
                            FileNemeList.append(file)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 遍历获取文件名列表
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # # print("\n♋ get查询-遍历获取文件名列表")
                # 导航列表
                navigationList = []

                for item in FileNemeList:
                    FileDir = os.path.join(
                        'statics/projects/', item)
                    with open(FileDir, 'r', encoding='utf-8') as f:
                        # 工程字典
                        projectDict = json.load(f)  # 此时ResDict是一个字典对象
                        # 工程名称
                        projectName = projectDict['key']
                        # 页面列表

                        pageList = [
                            {
                                'label': '编辑页面',
                                'key': 'none',
                                'layer': 2,
                                'addr': '/EditView'
                            }
                        ]

                        # 页面数据集
                        pageSet = projectDict['pages']
                        for Item in pageSet:
                            # # print(Item['label'])
                            pageList.append(
                                {
                                    'label': Item['label'],
                                    'key': Item['key'],
                                    'layer': 2,
                                    'pid': projectName,

                                }
                            )

                    ProjectNemeList = {
                        'label': projectDict['label'],
                        'key': projectDict['key'],
                        'layer': 1,
                        'children': pageList
                    }

                    navigationList.append(ProjectNemeList)

                # # print("------------------------------------------------ pageData")
                # # print(pageData)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出工程列表
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # print(navigationList)
                self.set_status(200)
                self.write(json.dumps(navigationList))

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 获取页面数据
        # =========================================================
        if query == "getPageData":
            # print("\n♋ get查询-获取页面数据")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 转储参数
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                # print("------------------------------------------------| 转储参数")
                projectName = self.get_argument("Name", strip=True)  # 文件名
                PageId = self.get_argument("pageId", strip=True)  # 页面id
                # print(projectName)
                # print(PageId)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 读取工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                project = ''
                FileDir = "statics/projects/" + projectName + ".json"
                with open(FileDir, "r",  encoding='utf-8') as f:
                    project = f.read()

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 转换为字典;
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                projectDict = json.loads(project)
                # print(projectDict)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 筛选出数据
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                viewData = projectDict['pages']
                pageData = []
                for Item in viewData:
                    if Item['key'] == PageId:
                        # print(Item)
                        pageData.append(Item)

                # # print("------------------------------------------------ pageData")
                # # print(pageData)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 建立工作数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                workSet = {
                    'pageData': pageData[0],
                    'equipData': projectDict['equipData'],
                }
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(json.dumps(workSet))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

# ——————————————————————————————————————————————————————————————————————
# post查询
# ——————————————————————————————————————————————————————————————————————

    def post(self):
        '''post查询'''
        # # print("\n♈ post 查询")
        query = self.get_argument("query", strip=True)  # 状态
        # =========================================================
        # 保存工程
        # =========================================================
        if query == "saveProject":
            # print('post查询-保存工程')

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                Name = self.get_argument("Name", strip=True)  # id
                Project = json.loads(self.request.body)
                # # print(" ★ 保存文件到【/Public/UploadFiles/Configuration/Projects/】文件夹下")
                # 文件名
                FileName = Name + '.json'
                outPath = "statics/projects/" + FileName
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 保存工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                with open(outPath, 'w', encoding='utf8') as f1:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(Project, f1, ensure_ascii=False, indent=2)
                

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('OK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 另存为工程
        # =========================================================
        if query == "saveAsProject":
            # # print('post查询-另存为工程')

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                Name = self.get_argument("Name", strip=True)  # id
                Project = json.loads(self.request.body)
                # # print(" ★ 保存文件到【/Public/UploadFiles/Configuration/Projects/】文件夹下")
                # 文件名
                FileName = Name + '.json'
                outPath = "statics/projects/" + FileName
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 保存工程
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                with open(outPath, 'w', encoding='utf8') as f1:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(Project, f1, ensure_ascii=False, indent=2)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('OK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 保存 块
        # =========================================================
        if query == "saveBlockGroup":
            # # print('post查询-保存 块')

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                data = json.loads(self.request.body)
                FileDir = "statics/blockGroup.json"
                with open(FileDir, 'w', encoding='utf8') as fBlock:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(data, fBlock, ensure_ascii=False, indent=2)
                self.write('OK')

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('OK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 保存 笔筒
        # =========================================================
        if query == "savePenContainer":
            # # print('post查询-保存 笔筒')

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                data = json.loads(self.request.body)
                FileDir = "statics/penContainer.json"
                with open(FileDir, 'w', encoding='utf8') as fPenContainer:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(data, fPenContainer,
                              ensure_ascii=False, indent=2)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('OK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 保存 客户端数据集
        # =========================================================
        if query == "saveClientSet":
            # # print("post查询-获取 客户端数据集")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                data = json.loads(self.request.body)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 写入 客户端数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                FileDir = "statics/clientSet.json"
                with open(FileDir, 'w', encoding='utf8') as fPenContainer:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(data, fPenContainer,
                              ensure_ascii=False, indent=2)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('FileSaveOK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 保存 控制数据集
        # =========================================================
        if query == "saveCtrlSet":
            # # print("post查询-获取 控制数据集")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                data = json.loads(self.request.body)
                # # print(" ★ 保存文件到【/Public/Configuration/DataSets/】文件夹下")

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 写入 客户端数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                FileDir = "statics/ctrlSet.json"
                with open(FileDir, 'w', encoding='utf8') as fPenContainer:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(data, fPenContainer,
                              ensure_ascii=False, indent=2)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('FileSaveOK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 保存 设备数据集
        # =========================================================
        if query == "saveEquips":
            # # print("post查询-保存 设备数据集")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                data = json.loads(self.request.body)
                # # print(" ★ 保存文件到【/Public/Configuration/DataSets/】文件夹下")

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 写入 设备数据集
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                FileDir = "statics/equipSet.json"
                with open(FileDir, 'w', encoding='utf8') as fchannelSet:
                    # ensure_ascii=False才能输入中文，否则是Unicode字符
                    # indent=2 JSON数据的缩进，美观
                    json.dump(data, fchannelSet, ensure_ascii=False, indent=2)

                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write('FileSaveOK')
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")

        # =========================================================
        # 根据id获取变量值;
        # =========================================================
        if query == "getValById":
            # # print("post查询-根据id获取变量值")

            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_开启
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if myDrive.serverState:
                IdVal = self.get_argument("Id", strip=True)  # id
                # # print(IdVal)
                getVal = myDrive.getValById(IdVal)
                # # print(getVal)
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                #   ★ 输出 响应结果
                # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                self.set_status(200)
                self.write(json.dumps(getVal))
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            #   ★ 服务器状态_为_关闭
            # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            else:
                self.set_status(404)
                self.write("Fail")
